package Z代码随想录.数组;

// 螺旋矩阵
// m*n

import java.util.LinkedList;
import java.util.List;

public class Leetcode54 {
    // 本题思路思路是 定义上下左右四个边界，加上一个 count 来计算遍历个数，当全部填充完以后就停止
    // 循环的条件，要加上 count 大于等于1
    // 如果不加，可能出现  例如  [[1,2,3]] 遍历完第一行就结束了。 而后续代码还会继续添加元素
    // 当遍历完最上面的一行的时候，上边界就 向下挪
    // 当遍历完最右边的一列的时候，右边界就 向左挪
    // 当遍历完最下面的一行的时候，下边界就 向上挪
    // 当遍历完最左面的一列的时候，左边界就 向右挪
    public static List<Integer> spiralOrder(int[][] matrix) {
        int top = 0;
        int right = matrix[0].length - 1;
        int bottom = matrix.length - 1;
        int left = 0;
        int count = matrix.length * matrix[0].length;
        List<Integer> list = new LinkedList<>();
        if (matrix == null || matrix.length == 0) return list;
        while (count >= 1) {
            // 先遍历最上面一行从左往后，行不变，列在变
            for (int i = left; i <= right && count >= 1; i++) {
                list.add(matrix[top][i]);
                count--;
            }
            top++;  // 向下挪
            // 遍历最右边的一列从上到下，列不变，行在变
            for (int i = top; i <= bottom && count >= 1; i++) {
                list.add(matrix[i][right]);
                count--;
            }
            right--; // 向左挪
            // 遍历最下面的一行从右往左，行不变，列在变
            for (int i = right; i >= left && count >= 1; i--) {
                list.add(matrix[bottom][i]);
                count--;
            }
            bottom--; // 向上挪
            // 遍历最左边的一列从下往上, 列不变，行在变
            for (int i = bottom; i >= top && count >= 1; i--) {
                list.add(matrix[i][left]);
                count--;
            }
            left++;
        }
        return list;
    }


    public static void main(String[] args) {
        int[][] array = new int[][]{{2, 3}};
        System.out.println(spiralOrder(array));
    }
}
